- Published on
Nestjs 공식문서 부수기 [3]
NestJS의 공식문서를 보며 직접 따라해보고 배워보도록 하겠습니다. (NestJS, n.d.)
컨트롤러 [2]
동적 라우팅
import { Param } from '@nestjs/common';
@Get(':id')
findOne(@Param() params): string {
console.log(params.id);
return `This action returns a #${params.id} cat`;
}
url의 id값에 따라 동적으로 랜더링 할 수 있습니다.
하위 도메인 라우팅
@Controller
데코레이터는 들어오는 요청의 HTTP 호스트가 특정 값과 일치하도록 요구하는 옵션을 사용할 수 있습니다
@Controller({ host: 'admin.example.com' })
export class AdminController {
@Get()
index(): string {
return 'Admin page';
}
}
경고 Fastify 는 중첩 라우터에 대한 지원이 없기 때문에 하위 도메인 라우팅을 사용할 때 (기본) Express 어댑터를 대신 사용해야 합니다.
이러한 방식으로 선언된 호스트 파라미터는 @HostParam()
메서드로 접근해야 사용하여 액세스할 수 있습니다.
@Controller({ host: ':account.example.com' })
export class AccountController {
@Get()
getInfo(@HostParam('account') account: string) {
return account;
}
}
비동기
모든 비동기 함수는 Promise
. 즉, Nest가 자체적으로 해결할 수 있는 지연된 값을 반환할 수 있습니다.
@Get()
async findAll(): Promise<any[]> {
return [];
}
페이로드 요청
POST
URL 매개변수을 허용하지 않았습니다. 여기에 @Body()
데코레이터 를 추가하여 이 문제를 해결해 보겠습니다 .
그러나 먼저(TypeScript를 사용하는 경우) DTO (Data Transfer Object) 스키마 를 결정해야 합니다 . DTO는 데이터가 네트워크를 통해 전송되는 방법을 정의하는 개체입니다. TypeScript 인터페이스를 사용하거나 간단한 클래스 를 사용하여 DTO 스키마를 결정할 수 있습니다. 흥미롭게도 여기에서 클래스 를 사용하는 것이 좋습니다. 왜요? 클래스는 JavaScript ES6 표준의 일부이므로 컴파일된 JavaScript에서 실제 엔터티로 보존됩니다. 반면에 TypeScript 인터페이스는 변환 중에 제거되기 때문에 Nest는 런타임에 이를 참조할 수 없습니다. 이것은 파이프 와 같은 기능이 런타임에 변수의 메타 유형에 액세스할 때 추가 가능성을 가능하게 하기 때문에 중요합니다.
CreateCatDto
클래스 를 생성해 보겠습니다 .
export class CreateCatDto {
name: string;
age: number;
breed: string;
}
그런 다음 새로 생성된 DTO를 내부에서 사용할 수 있습니다.
@Post()
async create(@Body() createCatDto: CreateCatDto) {
return 'This action adds a new cat';
}
시작 및 실행
위의 컨트롤러가 완전히 정의된 상태에서 Nest는 여전히 컨트롤러가 존재하는지 알지 못 하므로 이 클래스의 인스턴스를 생성하지 않습니다.
컨트롤러는 항상 모듈 데코레이터에 속하므로 controllers속성에 controller을 추가합니다.
import { Module } from '@nestjs/common';
import { CatsController } from './cats/cats.controller';
@Module({
controllers: [CatsController],
})
export class AppModule {}